package cn.tedu;

import sun.text.normalizer.Utility;

import java.sql.*;
import java.util.Scanner;

//测试 jdbc
public class testjdbc {
    public static void main(String[] args) throws Exception {
//        method();//普通方式
//        method2();//暴露sql注入问题
        method3();//解决sql注入问题
    }
    //解决sql注入问题
    private static void method3()  {
        Connection con=null;
        ResultSet rs=null;
        PreparedStatement ps=null;
        try {
        con=jdbcUtility.getConnection();
        //3.获取传输器
        System.out.println("请输入用户名：");
        String a=new Scanner(System.in).nextLine();
        System.out.println("请输入登陆密码：");
        String b=new Scanner(System.in).nextLine();
        String sql="select * from user where name=?  and pwd =? ";
        ps=con.prepareStatement(sql);
        //给sql设置参数
        ps.setString(1,a);//第一个？设置参数
        ps.setString(2,b);//第二个？设置参数
        //4.执行SQL
        rs=ps.executeQuery();
        //5.解析结果集
        while (rs.next()){
            for (int i = 1; i <=3 ; i++) {
                //按照索引查
                System.out.println(rs.getString(i));
            }
        }
        }catch(Exception e){
            e.printStackTrace();
            }finally {
            jdbcUtility.close(rs,ps,con);
        }
    }

    //暴露sql注入问题 --发生了sql拼接
    //需求：
    private static void method2() throws Exception {
//        System.out.println("请输入MySQL数据库的用户名：");
//        String UserName=new Scanner(System.in).nextLine();
//        System.out.println("请输入MySQL数据库的登陆密码：");
//        String PassWord=new Scanner(System.in).nextLine();
        //1.注册驱动jar包
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库
        Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest","root","root");
        //3.获取传输器
        Statement st=con.createStatement();

        //TODO 测试sql注入攻击问题jack'#和 Jack’ or ’1=1
        //是指当用户输入数据时，恶意包含了特殊的sql语句，改变了sql语句
        //导致只需要名字不需要密码也可以查看所有数据（数据泄露）


        System.out.println("请输入用户名：");
        String a=new Scanner(System.in).nextLine();
        System.out.println("请输入登陆密码：");
        String b=new Scanner(System.in).nextLine();
        //4.执行SQL
        String sql="select * from user where name='"+a+"' and pwd ='"+b+"'";
        ResultSet rs=st.executeQuery(sql);
        //5.解析结果集
        while (rs.next()){
            for (int i = 1; i <3 ; i++) {
                //按照索引查
                System.out.println(rs.getString(i));
            }
        }
        //6.释放资源
        rs.close();
        st.close();
        con.close();

    }

    //使用JDBC查询user表的数据
    private static void method() throws Exception {
        //1.注册驱动jar包
        Class.forName("com.mysql.jdbc.Driver"); // --反射：通过类名调用功能
        //2.连接数据库
        Connection con=DriverManager.getConnection(
                //“协议//服务器的名字：数据库的端口号/数据库名”，
                //"jdbc:mysql://localhost:3306/jdbctest", localhost是指本机的IP，也可以写成127.0.0.1 端口：3306 数据库名称：jdbctest
                "jdbc:mysql://localhost:3306/jdbctest",
                "root","root");
        //3.获取传输器
        Statement st=con.createStatement();
        //4.执行SQL
        String sql="select * from user where name='jack' and pwd='123' ";
        ResultSet rs=st.executeQuery(sql);
        //5.解析结果集
        while(rs.next()){//next()判断有数据吗
            //有数据就一个一个解析id/name/pwd
            for (int i = 1; i <=3 ; i++) {
                System.out.println(rs.getString(i));
            }
            String id=rs.getString(1);
            String name=rs.getString(2);
            String pwd=rs.getString(3);
            System.out.println(id+name+pwd);

            //获取列名
            String id2=rs.getString("id");
            String name2=rs.getString("name");
            String pwd2=rs.getString("pwd");
            System.out.println(id2+name2+pwd2);
        }
        //6.释放资源
        rs.close();
        st.close();
        con.close();
    }
}
